#include <iostream>
#include <sys/types.h>
#include <signal.h>

using namespace std;

void handler(int signo)
{
	// signal(SIGINT,SIG_DFL);
	// cout << "alarm has used" << endl;
	cout << "cathch a signo : " << signo << endl;
}

void printsig(sigset_t &pending)
{
	for (int i = 31; i >= 1; i--)
	{
		if (sigismember(&pending, i))
		{
			// cout << "signo:" << i << " is member" << endl;
			cout << '1';
		}
		else
		{
			// cout << "signo:" << i << " is not member" << endl;
			cout << '0';
		}
	}
	cout << endl << endl;
}

int main()
{
	sigset_t bset, oset;
	sigemptyset(&bset);
	sigemptyset(&oset);

	for(int i = 31;i >= 1;i--){
		sigaddset(&bset,i);
	}

	sigprocmask(SIG_SETMASK,&bset,&oset);

	sigset_t pending;

	while(true)
	{
		int n = sigpending(&pending);
		if(n < 0) continue;
		printsig(pending);
		sleep(1);
	}
	return 0;
}

// int main()
// {
// 	// signal(SIGINT,SIG_IGN);
// 	// signal(SIGALRM,handler);
// 	// alarm(10);
// 	// while(1){
// 	// 	cout << "wait 1 second" << endl;
// 	// 	sleep(1);
// 	// }
// 	signal(SIGINT,handler);

// 	sigset_t bset,oset;

// 	sigemptyset(&bset);
// 	sigemptyset(&oset);

// 	sigaddset(&bset,SIGINT); // 还没有把二号信号屏蔽，只是单纯的在栈里修改了这个对象
// 	//调用系统接口，才能实现二号信号的屏蔽
// 	sigprocmask(SIG_SETMASK,&bset,&oset); //屏蔽了二号信号

// 	sigset_t pending;
// 	//sigemptyset(&pending);

// 	int cnt = 0;
// 	while(1){
// 		int n = sigpending(&pending);
// 		if(n < 0) continue;
// 		printsig(pending);
// 		sleep(1);
// 		cnt++;
// 		if(cnt % 10 == 0){
// 			cout << "unblock 2 signo" << endl;
// 			sigprocmask(SIG_UNBLOCK,&bset,nullptr);//解除屏蔽
// 			sleep(1);
// 			sigprocmask(SIG_SETMASK,&bset,&oset); //屏蔽了二号信号
// 		}
// 	}

// 	return 0;
// }